home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / programming / source / term43-source.lha / Extras / Source / term-Source.lha / MacroPanel.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-02-07  |  8.4 KB  |  371 lines

  1. /*
  2. **    MacroPanel.c
  3. **
  4. **    Editing panel for key macro configuration
  5. **
  6. **    Copyright © 1990-1995 by Olaf `Olsen' Barthel
  7. **        All Rights Reserved
  8. */
  9.  
  10. #include "termGlobal.h"
  11.  
  12. enum    {    GAD_QUALIFIER=1,GAD_F1,GAD_F2,GAD_F3,GAD_F4,GAD_F5,GAD_F6,GAD_F7,
  13.         GAD_F8,GAD_F9,GAD_F10,GAD_USE,GAD_LOAD,GAD_SAVE,GAD_CANCEL };
  14.  
  15. BOOLEAN __regargs
  16. MacroPanel(struct MacroKeys *MacroKeys,STRPTR LastMacros,BOOLEAN Globals,struct Window *Parent)
  17. {
  18.     struct MacroKeys    *Keys;
  19.     ULONG             OldCRC;
  20.     BOOLEAN             MacroChanged = FALSE;
  21.  
  22.     OldCRC = DoCRC(MacroKeys,sizeof(struct MacroKeys));
  23.  
  24.     if(Keys = (struct MacroKeys *)AllocVecPooled(sizeof(struct MacroKeys),MEMF_ANY))
  25.     {
  26.         struct LayoutHandle *Handle;
  27.     
  28.         CopyMem(MacroKeys,Keys,sizeof(struct MacroKeys));
  29.  
  30.         if(Handle = LT_CreateHandleTags(Window -> WScreen,
  31.             LH_LocaleHook,    &LocaleHook,
  32.         TAG_DONE))
  33.         {
  34.             struct Window *PanelWindow;
  35.     
  36.             LT_New(Handle,
  37.                 LA_Type,    VERTICAL_KIND,
  38.             TAG_DONE);
  39.             {
  40.                 LT_New(Handle,
  41.                     LA_Type,    VERTICAL_KIND,
  42.                     LA_LabelID,    MSG_V36_0094,
  43.                 TAG_DONE);
  44.                 {
  45.                     LT_New(Handle,
  46.                         LA_Type,    VERTICAL_KIND,
  47.                     TAG_DONE);
  48.                     {
  49.                         LT_New(Handle,
  50.                             LA_Type,    CYCLE_KIND,
  51.                             LA_LabelID,    MSG_MACROPANEL_KEY_MODIFIER_GAD,
  52.                             LA_ID,        GAD_QUALIFIER,
  53.                             LACY_FirstLabel,MSG_MACROPANEL_NONE_TXT,
  54.                             LACY_LastLabel,    MSG_MACROPANEL_CONTROL_TXT,
  55.                         TAG_DONE);
  56.     
  57.                         LT_New(Handle,
  58.                             LA_Type,    XBAR_KIND,
  59.                         TAG_DONE);
  60.     
  61.                         LT_EndGroup(Handle);
  62.                     }
  63.     
  64.                     LT_New(Handle,
  65.                         LA_Type,    VERTICAL_KIND,
  66.                     TAG_DONE);
  67.                     {
  68.                         STATIC STRPTR Labels[10] =
  69.                         {
  70.                             "F _1",
  71.                             "F _2",
  72.                             "F _3",
  73.                             "F _4",
  74.                             "F _5",
  75.                             "F _6",
  76.                             "F _7",
  77.                             "F _8",
  78.                             "F _9",
  79.                             "F1_0"
  80.                         };
  81.     
  82.                         LONG i;
  83.     
  84.                         for(i = 0 ; i < 10 ; i++)
  85.                         {
  86.                             LT_New(Handle,
  87.                                 LA_Type,    STRING_KIND,
  88.                                 LA_LabelText,    Labels[i],
  89.                                 LA_Chars,    40,
  90.                                 LA_ID,        GAD_F1 + i,
  91.                             TAG_DONE);
  92.                         }
  93.     
  94.                         LT_EndGroup(Handle);
  95.                     }
  96.     
  97.                     LT_EndGroup(Handle);
  98.                 }
  99.     
  100.                 LT_New(Handle,
  101.                     LA_Type,VERTICAL_KIND,
  102.                 TAG_DONE);
  103.                 {
  104.                     LT_New(Handle,
  105.                         LA_Type,    XBAR_KIND,
  106.                         LAXB_FullSize,    TRUE,
  107.                     TAG_DONE);
  108.     
  109.                     LT_EndGroup(Handle);
  110.                 }
  111.  
  112.                 LT_New(Handle,LA_Type,HORIZONTAL_KIND,
  113.                     LAGR_SameSize,    TRUE,
  114.                     LAGR_Spread,    TRUE,
  115.                 TAG_DONE);
  116.                 {
  117.                     LT_New(Handle,
  118.                         LA_Type,    BUTTON_KIND,
  119.                         LA_LabelID,    MSG_GLOBAL_USE_GAD,
  120.                         LA_ID,        GAD_USE,
  121.                         LABT_ReturnKey,    TRUE,
  122.                         LABT_ExtraFat,    TRUE,
  123.                     TAG_DONE);
  124.     
  125.                     LT_New(Handle,
  126.                         LA_Type,    BUTTON_KIND,
  127.                         LA_LabelID,    MSG_GLOBAL_LOAD_GAD,
  128.                         LA_ID,        GAD_LOAD,
  129.                         LABT_ExtraFat,    TRUE,
  130.                     TAG_DONE);
  131.     
  132.                     LT_New(Handle,
  133.                         LA_Type,    BUTTON_KIND,
  134.                         LA_LabelID,    MSG_GLOBAL_SAVE_GAD,
  135.                         LA_ID,        GAD_SAVE,
  136.                         LABT_ExtraFat,    TRUE,
  137.                     TAG_DONE);
  138.     
  139.                     LT_New(Handle,
  140.                         LA_Type,    BUTTON_KIND,
  141.                         LA_LabelID,    MSG_GLOBAL_CANCEL_GAD,
  142.                         LA_ID,        GAD_CANCEL,
  143.                         LABT_EscKey,    TRUE,
  144.                         LABT_ExtraFat,    TRUE,
  145.                     TAG_DONE);
  146.     
  147.                     LT_EndGroup(Handle);
  148.                 }
  149.     
  150.                 LT_EndGroup(Handle);
  151.             }
  152.     
  153.             if(PanelWindow = LT_Layout(Handle,LocaleString(MSG_MACROPANEL_MACRO_PREFERENCES_TXT),NULL,0,0,IDCMP_CLOSEWINDOW,0,
  154.                 LAWN_HelpHook,        &GuideHook,
  155.                 LAWN_Parent,        Parent,
  156.                 WA_DepthGadget,        TRUE,
  157.                 WA_CloseGadget,        TRUE,
  158.                 WA_DragBar,        TRUE,
  159.                 WA_RMBTrap,        TRUE,
  160.                 WA_Activate,        TRUE,
  161.             TAG_DONE))
  162.             {
  163.                 struct IntuiMessage    *Message;
  164.                 BOOLEAN             Done = FALSE;
  165.                 ULONG             MsgClass,
  166.                              MsgQualifier;
  167.                 UWORD             MsgCode;
  168.                 struct Gadget        *MsgGadget;
  169.                 UBYTE             DummyBuffer[MAX_FILENAME_LENGTH],
  170.                             *DummyChar;
  171.                 struct FileRequester    *FileRequest;
  172.                 LONG             Modifier = 0,i;
  173.  
  174.                 GuideContext(CONTEXT_MACROS);
  175.     
  176.                 PushWindow(PanelWindow);
  177.  
  178.                 LT_ShowWindow(Handle,TRUE);
  179.     
  180.                 if(XEmulatorBase && Config -> TerminalConfig -> EmulationMode == EMULATION_EXTERNAL && Globals)
  181.                 {
  182.                     ULONG KeyMask = XEmulatorGetFreeMacroKeys(XEM_IO,Modifier);
  183.  
  184.                     for(i = 0 ; i < 10 ; i++)
  185.                     {
  186.                         LT_SetAttributes(Handle,GAD_F1 + i,
  187.                             GTST_String,    Keys -> Keys[Modifier][i],
  188.                             GA_Disabled,    !(KeyMask & (1L << i)),
  189.                         TAG_DONE);
  190.                     }
  191.                 }
  192.                 else
  193.                 {
  194.                     for(i = 0 ; i < 10 ; i++)
  195.                     {
  196.                         LT_SetAttributes(Handle,GAD_F1 + i,
  197.                             GTST_String,    Keys -> Keys[Modifier][i],
  198.                         TAG_DONE);
  199.                     }
  200.                 }
  201.  
  202.                 do
  203.                 {
  204.                     if(Wait(PORTMASK(PanelWindow -> UserPort) | SIG_BREAK) & SIG_BREAK)
  205.                     {
  206.                         CopyMem(Keys,MacroKeys,sizeof(struct MacroKeys));
  207.     
  208.                         break;
  209.                     }
  210.     
  211.                     while(Message = (struct IntuiMessage *)GT_GetIMsg(PanelWindow -> UserPort))
  212.                     {
  213.                         MsgClass    = Message -> Class;
  214.                         MsgQualifier    = Message -> Qualifier;
  215.                         MsgCode        = Message -> Code;
  216.                         MsgGadget    = (struct Gadget *)Message -> IAddress;
  217.     
  218.                         GT_ReplyIMsg(Message);
  219.     
  220.                         LT_HandleInput(Handle,MsgQualifier,&MsgClass,&MsgCode,&MsgGadget);
  221.     
  222.                         if(MsgClass == IDCMP_CLOSEWINDOW)
  223.                         {
  224.                             CopyMem(Keys,MacroKeys,sizeof(struct MacroKeys));
  225.     
  226.                             Done = TRUE;
  227.                         }
  228.     
  229.                         if(MsgClass == IDCMP_GADGETUP)
  230.                         {
  231.                             switch(MsgGadget -> GadgetID)
  232.                             {
  233.                                 case GAD_QUALIFIER:
  234.  
  235.                                     for(i = 0 ; i < 10 ; i++)
  236.                                         strcpy(Keys -> Keys[Modifier][i],(STRPTR)LT_GetAttributes(Handle,GAD_F1 + i,TAG_DONE));
  237.  
  238.                                     Modifier = MsgCode;
  239.  
  240.                                     if(XEmulatorBase && Config -> TerminalConfig -> EmulationMode == EMULATION_EXTERNAL && Globals)
  241.                                     {
  242.                                         ULONG KeyMask = XEmulatorGetFreeMacroKeys(XEM_IO,Modifier);
  243.  
  244.                                         for(i = 0 ; i < 10 ; i++)
  245.                                         {
  246.                                             LT_SetAttributes(Handle,GAD_F1 + i,
  247.                                                 GTST_String,    Keys -> Keys[Modifier][i],
  248.                                                 GA_Disabled,    !(KeyMask & (1L << i)),
  249.                                             TAG_DONE);
  250.                                         }
  251.                                     }
  252.                                     else
  253.                                     {
  254.                                         for(i = 0 ; i < 10 ; i++)
  255.                                         {
  256.                                             LT_SetAttributes(Handle,GAD_F1 + i,
  257.                                                 GTST_String,Keys -> Keys[Modifier][i],
  258.                                             TAG_DONE);
  259.                                         }
  260.                                     }
  261.  
  262.                                     break;
  263.  
  264.                                 case GAD_USE:
  265.     
  266.                                     for(i = 0 ; i < 10 ; i++)
  267.                                         strcpy(Keys -> Keys[Modifier][i],(STRPTR)LT_GetAttributes(Handle,GAD_F1 + i,TAG_DONE));
  268.  
  269.                                     CopyMem(Keys,MacroKeys,sizeof(struct MacroKeys));
  270.  
  271.                                     Done = TRUE;
  272.                                     break;
  273.     
  274.                                 case GAD_LOAD:
  275.  
  276.                                     strcpy(DummyBuffer,LastMacros);
  277.  
  278.                                     DummyChar = PathPart(DummyBuffer);
  279.  
  280.                                     *DummyChar = 0;
  281.  
  282.                                     LT_LockWindow(PanelWindow);
  283.  
  284.                                     if(FileRequest = GetFile(PanelWindow,LocaleString(MSG_MACROPANEL_LOAD_MACRO_KEYS_TXT),DummyBuffer,FilePart(LastMacros),DummyBuffer,"#?.prefs",FALSE,FALSE,FALSE,LocaleString(MSG_GLOBAL_LOAD_TXT),TRUE))
  285.                                     {
  286.                                         if(!LoadMacros(DummyBuffer,Keys))
  287.                                             ShowError(PanelWindow,ERR_LOAD_ERROR,IoErr(),DummyBuffer);
  288.                                         else
  289.                                         {
  290.                                             MacroChanged = FALSE;
  291.  
  292.                                             OldCRC = DoCRC(Keys,sizeof(struct MacroKeys));
  293.  
  294.                                             strcpy(Config -> FileConfig -> MacroFileName,DummyBuffer);
  295.  
  296.                                             strcpy(LastMacros,DummyBuffer);
  297.  
  298.                                             for(i = 0 ; i < 10 ; i++)
  299.                                             {
  300.                                                 LT_SetAttributes(Handle,GAD_F1 + i,
  301.                                                     GTST_String,Keys -> Keys[Modifier][i],
  302.                                                 TAG_DONE);
  303.                                             }
  304.                                         }
  305.  
  306.                                         FreeAslRequest(FileRequest);
  307.                                     }
  308.  
  309.                                     LT_UnlockWindow(PanelWindow);
  310.  
  311.                                     break;
  312.  
  313.                                 case GAD_SAVE:
  314.  
  315.                                     strcpy(DummyBuffer,LastMacros);
  316.  
  317.                                     DummyChar = PathPart(DummyBuffer);
  318.  
  319.                                     *DummyChar = 0;
  320.  
  321.                                     LT_LockWindow(PanelWindow);
  322.  
  323.                                     for(i = 0 ; i < 10 ; i++)
  324.                                         strcpy(Keys -> Keys[Modifier][i],(STRPTR)LT_GetAttributes(Handle,GAD_F1 + i,TAG_DONE));
  325.  
  326.                                     if(FileRequest = GetFile(PanelWindow,LocaleString(MSG_MACROPANEL_SAVE_MACRO_KEYS_TXT),DummyBuffer,FilePart(LastMacros),DummyBuffer,"#?.prefs",TRUE,FALSE,FALSE,LocaleString(MSG_GLOBAL_SAVE_TXT),TRUE))
  327.                                     {
  328.                                         if(!WriteIFFData(DummyBuffer,Keys,sizeof(struct MacroKeys),ID_KEYS))
  329.                                             ShowError(PanelWindow,ERR_SAVE_ERROR,IoErr(),DummyBuffer);
  330.                                         else
  331.                                         {
  332.                                             strcpy(LastMacros,DummyBuffer);
  333.  
  334.                                             MacroChanged = FALSE;
  335.  
  336.                                             OldCRC = DoCRC(Keys,sizeof(struct MacroKeys));
  337.                                         }
  338.  
  339.                                         FreeAslRequest(FileRequest);
  340.                                     }
  341.  
  342.                                     LT_UnlockWindow(PanelWindow);
  343.  
  344.                                     break;
  345.  
  346.                                 case GAD_CANCEL:
  347.     
  348.                                     CopyMem(Keys,MacroKeys,sizeof(struct MacroKeys));
  349.     
  350.                                     Done = TRUE;
  351.                                     break;
  352.                             }
  353.                         }
  354.                     }
  355.                 }
  356.                 while(!Done);
  357.     
  358.                 PopWindow();
  359.             }
  360.     
  361.             LT_DeleteHandle(Handle);
  362.         }
  363.  
  364.         FreeVecPooled(Keys);
  365.     }
  366.  
  367.     MacroChanged |= (OldCRC != DoCRC(MacroKeys,sizeof(struct MacroKeys)));
  368.  
  369.     return(MacroChanged);
  370. }
  371.